package com.smart.community.user.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 用户上传文件VO类
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
@Data
public class UserUploadFileVO {

    /**
     * 文件ID
     */
    private Long id;

    /**
     * 上传用户ID
     */
    private Long userId;

    /**
     * 原始文件名
     */
    private String fileName;

    /**
     * 文件存储路径
     */
    private String filePath;

    /**
     * 文件访问URL
     */
    private String fileUrl;

    /**
     * 文件大小(字节)
     */
    private Long fileSize;

    /**
     * 文件类型(MIME类型)
     */
    private String fileType;

    /**
     * 文件扩展名
     */
    private String fileExtension;

    /**
     * MinIO存储桶名称
     */
    private String bucketName;

    /**
     * MinIO对象名称
     */
    private String objectName;

    /**
     * 上传类型：AVATAR-头像，DOCUMENT-文档，IMAGE-图片，OTHER-其他
     */
    private String uploadType;

    /**
     * 上传来源：WEB-网页端，APP-移动端
     */
    private String uploadSource;

    /**
     * 文件MD5哈希值
     */
    private String md5Hash;

    /**
     * 文件SHA256哈希值
     */
    private String sha256Hash;

    /**
     * 是否为图片：0-否，1-是
     */
    private Integer isImage;

    /**
     * 图片宽度(像素)
     */
    private Integer imageWidth;

    /**
     * 图片高度(像素)
     */
    private Integer imageHeight;

    /**
     * 文件状态：0-已删除，1-正常，2-待审核
     */
    private Integer status;

    /**
     * 下载次数
     */
    private Integer downloadCount;

    /**
     * 查看次数
     */
    private Integer viewCount;

    /**
     * 过期时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime expireTime;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * 文件大小格式化显示
     */
    private String fileSizeFormatted;

    /**
     * 是否为图片
     */
    private Boolean isImageFile;

    /**
     * 获取文件大小格式化显示
     */
    public String getFileSizeFormatted() {
        if (fileSize == null) {
            return "0 B";
        }
        
        long size = fileSize;
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int unitIndex = 0;
        
        while (size >= 1024 && unitIndex < units.length - 1) {
            size /= 1024;
            unitIndex++;
        }
        
        return String.format("%.2f %s", (double) size, units[unitIndex]);
    }

    /**
     * 获取是否为图片文件
     */
    public Boolean getIsImageFile() {
        return isImage != null && isImage == 1;
    }
} 